package br.com.ava.core.usuario;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import br.com.ava.core.ConstantesMensagens;
import br.com.ava.core.infra.excecao.NegocioException;
import br.com.ava.core.infra.mensagem.Mensagem;
import br.com.ava.core.infra.persistencia.AbstractMediator;

/**
 * Define o Mediator utilizado para Usuario no sistema.
 */
@SuppressWarnings("serial")
public class UsuarioMediator extends AbstractMediator<Usuario> {

	private UsuarioDAO dao;

	/**
	 * Consulta usuário por login e senha.
	 * 
	 * @param login
	 *            Login para consulta.
	 * @param senha
	 *            senha para consula.
	 * @return Usuário com login e senha informados.
	 */
	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public Usuario buscar(String login, String senha) {

		validarCamposLogin(login, senha);

		Usuario retorno = dao.buscar(login, senha);

		if (retorno == null) {
			throw new NegocioException(
					ConstantesMensagens.MSG_ERRO_LOGIN_INCORRETO);
		}

		return retorno;
	}

	/**
	 * Consulta usuário por login.
	 * 
	 * @param login
	 *            Login para consulta.
	 * @return Usuário com login.
	 */
	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public Usuario buscarPorLogin(String login) {

		return dao.buscarPorLogin(login);
	}

	private void validarCamposLogin(String login, String senha) {

		List<Mensagem> mensagens = new ArrayList<Mensagem>();

		if (StringUtils.isEmpty(login)) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Login"));
		}

		if (StringUtils.isEmpty(senha)) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Senha"));
		}

		if (!mensagens.isEmpty()) {
			throw new NegocioException(mensagens);
		}
	}

	/** {@inheritDoc} */
	@Override
	protected UsuarioDAO getDao() {
		return dao;
	}

	public void setDao(UsuarioDAO dao) {
		this.dao = dao;
	}

}
